package com.itany.corejava.code12_线程;

import java.util.Scanner;

/**
 * @author 石小俊
 * @date 2023年05月15日 10:40
 * 使用线程实现售票功能,共有两个售票窗口,共出售100张票
 */
public class Test03_练习 {
    public static void main(String[] args) {
        // 该方式只实例化了一次TicketRunnable,因此其票数为:100
        TicketRunnable tr = new TicketRunnable();
        Thread t1 = new Thread(tr, "窗口1");
        Thread t2 = new Thread(tr, "窗口2");
        Thread t3= new Thread(tr, "窗口3");
        // 运行后,其出票的时候可能不是按照顺序依次显示
        // 在线程执行过程中,某个线程抢到CPU时间片,但是业务尚未执行完成
        // 被另一个线程抢走了CPU时间片,将会先执行当前线程的
        // 等后面再抢回来后,才会继续之前之前的业务
        // 因此,会导致票数显示出来的并不是依次递减的
        t1.start();
        t2.start();
        t3.start();

        // 在TicketThread中初始化了票的总数
        // 此时创建了两个实例,因此每个实例都是独立的票
        // 最终的票的总数为:100*2 = 200
//        TicketThread t1 = new TicketThread();
//        TicketThread t2 = new TicketThread();
//        t1.start();
//        t2.start();
    }
}

class TicketRunnable implements Runnable {
    // 共100张票
    private int num = 100;

    @Override
    public void run() {
        while (num > 0) {
            System.out.println(Thread.currentThread().getName() + "正在出票:" + num--);
        }
    }
}

class TicketThread extends Thread {
    // 共100张票
    private int num = 100;

    @Override
    public void run() {
        while (num > 0) {
            System.out.println(Thread.currentThread().getName() + "正在出票:" + num--);
        }
    }
}